#include <my_head.h>

int main(int argc, const char *argv[]){
    pid_t pid = 0;
    // fork创建子进程，然后父进程退出，让子进程变成孤儿进程
    if(-1 == (pid = fork())){
        ERR_LOG("fork error");
    }else if(0 < pid){ // 父进程
        exit(EXIT_SUCCESS); // 父进程退出后子进程变成孤儿
    }else if(0 == pid){ // 子进程
        // 在子进程中写守护进程的功能
        // 使用setsid函数创建一个新的会话和进程组 让孤儿进程作为唯一成员
        if(-1 == setsid())
            ERR_LOG("setsid error");
        // 使用chdir函数修改进程的工作目录到一个不会被删除、不会被卸载的目录下
        if(-1 == chdir("/")) // 具体改到哪个目录由实际开发时项目组指定
            ERR_LOG("chdir error");
        // 使用 umask 修改创建文件的掩码 限制创建的文件的最大权限
        umask(0066); // 具体改成多少 由实际开发时项目组指定
        // 关闭所有从父进程那里继承过来的已经打开的文件描述符 close
        for(int i = 3; i < 1024; i++){
            close(i);
        }
        // 将标准输入、标准输出、标准出错都重定向到文件中
        int fd = open("xja.log", O_WRONLY|O_CREAT|O_TRUNC, 0664);
        if(-1 == fd)
            ERR_LOG("open error");
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        // 开启自己的服务
        int i = 0;
        while(1){
            // 具体看什么 也由实际开发时项目组指定
            printf("hello world %d\n", ++i);
            fflush(stdout);
            sleep(1);
        }
        close(fd);
    }

    return 0;
}